/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sofia.Persistencia.Managers;

import Principal.MainSofia;
import java.util.Iterator;
import java.util.List;
import java.sql.Date;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;
import sofia.LogicaNegocio.Paciente;
import sofia.Persistencia.Entidades.EPaciente;

/**
 *
 * @author crisfalt
 */
public class MPaciente {

        @PersistenceUnit
        private EntityManagerFactory managerFactory;
        private EntityManager entityManager;

        public MPaciente() {
                managerFactory = MainSofia.managerFactory;
                entityManager = managerFactory.createEntityManager();
        }

        /**
        * Este metodo se encarga de la persistencia en la entidad Informe
        * de un objeto Informe.
        *
         * @param objPaciente
         * @throws RollbackException
         * @throws EntityExistsException 
        */
        public void crearPaciente( final Paciente objPaciente ) throws RollbackException, EntityExistsException {
                entityManager.clear();
                EPaciente entidadPaciente = new EPaciente();
                entidadPaciente.setIdCedula( objPaciente.getIdCedula() );
                entidadPaciente.setNombre( objPaciente.getNombre() );
                entidadPaciente.setFechaNacimiento( objPaciente.getFechaNacimiento() );
                entidadPaciente.setEdad( objPaciente.getEdad() );
                entidadPaciente.setDiagnosticoMedico( objPaciente.getDiagnosticoMedico() );
                entidadPaciente.setMedicoRemitente( objPaciente.getMedicoRemitente() );
                entidadPaciente.setNombreAcudiente( objPaciente.getNombreAcudiente() );
                entidadPaciente.setEps( objPaciente.getEps() );
                entidadPaciente.setFechaIngreso( objPaciente.getFechaIngreso() );
                entidadPaciente.setDiagnosticoFisioterapeutico( objPaciente.getDiagnosticoFisioterapeutico() );
                entidadPaciente.setResumenHistoriaClinica( objPaciente.getResumenHistoriaClinica() );
                entidadPaciente.setTipoPaciente( objPaciente.getTipoPaciente() );

                //persiste el objeto en la entidad
                EntityTransaction transaccion = entityManager.getTransaction();
                try {
                        transaccion.begin();
                        entityManager.persist( entidadPaciente );
                }
                catch (EntityExistsException ex) {
                        throw ex;
                }
                finally {
                        transaccion.commit();
                }
                entityManager.clear();
        }

        public void actualizarPaciente( final String idPaciente , final Paciente paciente ) {
                entityManager.clear();
                EPaciente entidadPaciente;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadPaciente = entityManager.find( EPaciente.class , idPaciente );
                transaccion.commit();
                if( entidadPaciente != null ) {
//                        la llave es unica no puede ser cambiada
//                        entidadPaciente.setIdCedula( paciente.getIdCedula() );
                        entidadPaciente.setNombre( paciente.getNombre() );
                        entidadPaciente.setFechaNacimiento( paciente.getFechaNacimiento() );
                        entidadPaciente.setEdad( paciente.getEdad() );
                        entidadPaciente.setDiagnosticoMedico( paciente.getDiagnosticoMedico() );
                        entidadPaciente.setMedicoRemitente( paciente.getMedicoRemitente() );
                        entidadPaciente.setNombreAcudiente( paciente.getNombreAcudiente() );
                        entidadPaciente.setEps( paciente.getEps() );
                        entidadPaciente.setFechaIngreso( paciente.getFechaIngreso() );
                        entidadPaciente.setDiagnosticoFisioterapeutico( paciente.getDiagnosticoFisioterapeutico() );
                        entidadPaciente.setResumenHistoriaClinica( paciente.getResumenHistoriaClinica() );
                        entidadPaciente.setTipoPaciente( paciente.getTipoPaciente() );

                        transaccion.begin();
                        entityManager.merge( entidadPaciente );
                        transaccion.commit();
                }
                entityManager.clear();
        }

        public void eliminarPaciente( final int idPaciente ) {
                entityManager.clear();
                EPaciente entidadPaciente;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadPaciente = entityManager.find( EPaciente.class , idPaciente );
                entityManager.remove( entidadPaciente );
                transaccion.commit();
                entityManager.clear();
        }

        public Paciente obtenerPaciente( final String idPaciente ) {
                entityManager.clear();
                EPaciente entidadPaciente;
                Paciente paciente = null;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadPaciente = entityManager.find( EPaciente.class , idPaciente );
                transaccion.commit();
                if( entidadPaciente != null ) {
                        paciente = new Paciente();
                        paciente.setIdCedula( entidadPaciente.getIdCedula() );
                        paciente.setNombre( entidadPaciente.getNombre() );
                        paciente.setFechaNacimiento( (Date) entidadPaciente.getFechaNacimiento());
                        paciente.setEdad( entidadPaciente.getEdad() );
                        paciente.setDiagnosticoMedico( entidadPaciente.getDiagnosticoMedico() );
                        paciente.setMedicoRemitente( entidadPaciente.getMedicoRemitente() );
                        paciente.setNombreAcudiente( entidadPaciente.getNombreAcudiente() );
                        paciente.setEps( entidadPaciente.getEps() );
                        paciente.setFechaIngreso( (Date) entidadPaciente.getFechaIngreso());
                        paciente.setDiagnosticoFisioterapeutico( entidadPaciente.getDiagnosticoFisioterapeutico() );
                        paciente.setResumenHistoriaClinica( entidadPaciente.getResumenHistoriaClinica() );
                        paciente.setTipoPaciente( entidadPaciente.getTipoPaciente() );
                }
                entityManager.clear();
                return paciente;
        }

        

        public List obtenerPacientesRegistrados() {
                entityManager.clear();
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                List pacientes = null;
                Query query = entityManager.createQuery( "SELECT ePaciente FROM EPaciente ePaciente" );
                pacientes = query.getResultList();
                transaccion.commit();
                if( !pacientes.isEmpty() ) {
                        System.out.println( "Leyendo " + pacientes.size() + " EPaciente" );
//                        Iterator stIterator = pacientes.iterator();
//                        while( stIterator.hasNext() ) {
//                                EPaciente entidadPaciente = (EPaciente)stIterator.next();
//                                System.out.println( "id " + entidadPaciente.getIdCedula() );
//                                System.out.println( "eps " + entidadPaciente.getEps() );
//                                System.out.println( "nombre " + entidadPaciente.getNombre() );
//                        }
                }
                entityManager.clear();
                return pacientes;
        }

}
